在前一篇文章中,列了一些插值器,包括颜色的、尺寸的等等,但他们都是线性的,也就是说,他们在执行事件内,都是以匀速计算的,假如我们需要一些特殊的效果,譬如先快后慢之类的效果,该怎么办呢?
这里就用到了 Curved
,它内部封装了一些不同效果的插值器,运用这些非线性插值器,可以帮助我们实现更丰富的动画效果,使用起来也很简单,直接创建一个 CurvedAnimation
对象,然后将插值器传入即可:
class AnimationRouteState extends State<AnimationRoute>
with TickerProviderStateMixin {
AnimationController animationController;
Animation animation;
Color backgroundColor;
@override
void initState() {
super.initState();
animationController = new AnimationController(
vsync: this, duration: Duration(milliseconds: 1000), debugLabel: "测试");
CurvedAnimation curvedAnimation = CurvedAnimation(parent: animationController, curve: Curves.easeIn);
animation = ColorTween(begin: Colors.red, end: Colors.lightGreen)
.animate(curvedAnimation);
animationController.addListener(() {
setState(() {});
backgroundColor = animation.value;
if(curvedAnimation.isCompleted){
animationController.repeat(reverse: true);
}
});
// 开始播放动画
animationController.forward();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text('动画'),
),
body: Container(
alignment: Alignment.center,
child: Container(
width: 400,
color: backgroundColor,
height: 400,
),
),
);
}
@override
void dispose() {
super.dispose();
// 动画使用完成后必需要销毁
animationController.dispose();
}
}
效果就不上了,在上面的例子中,插值器使用的是 Curves.easeIn
,Flutter 中内置了多种常用变化曲线:
- linear,线性的,和 Tween 一样
- decelerate,匀减速
- ease,开始加速,后面减速
- easeIn,开始慢,后面快
- easeOut,开始快,后面慢
- easeInOut,开始慢,然后加速,最后再减速
- fastOutSlowIn,快出慢进
- bounceIn,进入反弹
- bounceOut,退出反弹
- bounceInOut,进出反弹
- elasticIn,弹性进入
- elasticOut,弹性退出
- elasticInOut,弹性进出
这些曲线效果可以看这里 Curves-class
如果这些还不能满足我们的使用,还可以自己创建:
class MyCurve extends Curve {
@override
double transform(double t) {
return math.sin(t * math.PI * 2);
}
}